package com.changgou.user.listener;

import com.alibaba.fastjson.JSON;
import com.changgou.order.pojo.Task;
import com.changgou.user.config.RabbitMQConfig;
import com.changgou.user.service.UserService;
import org.apache.commons.lang.StringUtils;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

@Component
public class AddPointListener {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private UserService userService;

    @Autowired
    private RabbitTemplate rabbitTemplate;
    /**
     * 接收任务监听器
     *      判断redis中的任务标记
     *          !null  -> 有任务在执行,直接return,不执行.
     *      判断是否已经操作过积分
     * @param message task的json数据
     */
    // TODO 5 接收消息
    @RabbitListener(queues = RabbitMQConfig.CG_BUYING_ADDPOINT)
    public void receiveMessage(String message){
        //数据转换
        Task task = JSON.parseObject(message, Task.class);

        //当前任务为空,不处理.
        if(task == null || StringUtils.isEmpty(task.getRequestBody())){
            return;
        }

        // TODO 6 判断redis中的标记,是否有任务执行.
        //判断是否有任务标记
        Object value = redisTemplate.boundValueOps(task.getId()).get();
        if(value != null){
            //有人正在执行任务.
            return;
        }

        //更新用户的积分
        // TODO 7-11 在本地事务中进行控制
        int count = userService.updateUserPoint(task);

        if(count <= 0 ){
            //更新失败
            return ;
        }

        //发送一个返回通知,结束新增积分队列中发送一条消息
        //需要在执行完成后,发送通知结果,告知已经处理完新增积分的流程
        //在order的监听器中,进行删除任务记录,新增历史任务记录.
        // TODO 12 通知订单微服务,已经执行完成新增积分操作.
        rabbitTemplate.convertAndSend(
                RabbitMQConfig.EX_BUYING_ADDPOINTUSER,
                RabbitMQConfig.CG_BUYING_FINISHADDPOINT_KEY,
                JSON.toJSONString(task)
                );
    }
}
